const { Sequelize } = require("sequelize");

module.exports = (sequelize, DataTypes) => {
  const Need = sequelize.define(
    "need",
    {
      title: {
        type: DataTypes.STRING(255),
        allowNull: false,
      },
      details: {
        type: DataTypes.TEXT,
        allowNull: false,
      },
      creator: {
        type: DataTypes.STRING(50),
        allowNull: false,
      },
      creatorId: {
        type: DataTypes.INTEGER,
        allowNull: false,
      },
      handlerArray: {
        type: DataTypes.JSON, // 使用 JSON 类型字段
        defaultValue: [], // 默认值为空数组
      },
      //优先级
      priority: {
        type: DataTypes.STRING(10),
        defaultValue: "",
        validate: {
          isIn: [["", "Low", "Middle", "High"]],
        },
      },
      startDate: {
        type: DataTypes.DATE,
        defaultValue: null,
      },
      endDate: {
        type: DataTypes.DATE,
        defaultValue: null,
      },
      // 完成日期
      completedDate: {
        type: DataTypes.DATE,
      },
      status: {
        type: DataTypes.STRING(50),
        allowNull: false,
        defaultValue: "规划中",
        validate: {
          isIn: [["规划中", "实现中", "已实现", "已拒绝", "已删除"]],
        },
      },
      comment: {
        type: DataTypes.TEXT, // 评论
      },
      // 分类
      category: {
        type: DataTypes.STRING(50),
        defaultValue: "未分类",
        validate: {
          isIn: [["未分类", "技术需求", "产品需求", "新需求", "优化需求"]],
        },
      },
      projectName: {
        type: DataTypes.STRING(50),
        allowNull: false,
      },
      // 变更人
      changerName: {
        type: DataTypes.STRING(50),
        allowNull: false,
      },
      // 变更人id
      changerId: {
        type: DataTypes.INTEGER,
        allowNull: false,
      },
      // 变更类型
      changeType: {
        type: DataTypes.STRING(50),
        validate: {
          isIn: [["新增", "修改", "流转", "删除", "恢复", "评论"]],
        },
      },
    },
    {
      paranoid: true, // 软删除
      freezeTableName: true, //不使用sequelize给模型自定义的表名（自定义表名的命名规则：模型名后加s）
      timestamps: true, //使用软删除需开启：为true，在获取数据时，会自动添加两列数据（createdAt、updatedAt）
    }
  );

  // 需求历史变更记录-创建
  Need.addHook("afterCreate", (instance, options) => {
    // console.log(instance.get());

    // console.log(instance.changed());
    const changedField = JSON.stringify(
      instance.changed().filter(
        //筛选不需要的变更字段
        (field) =>
          field !== "id" &&
          field !== "projectId" &&
          field !== "projectName" &&
          field !== "changerId" &&
          field !== "changerName" &&
          field !== "startDate" &&
          field !== "endDate" &&
          field !== "creatorId" &&
          field !== "changeType" // 24.4.30
      )
    );
    // console.log(changedField);

    const { id, ...other } = instance.get();
    // console.log(other);
    return sequelize.model("needHistory").create({
      needId: id,
      changedField: changedField,

      //  获取当前实例的所有值
      ...other,
    });
  });

  // 需求历史变更记录-变更
  Need.addHook("beforeUpdate", (instance, options) => {
    // console.log(instance.get());
    // console.log(instance.changed())

    if (instance.changed()) {
      const changedField = JSON.stringify(
        instance.changed().filter(
          // 筛选不需要的变更字段
          (field) => field !== "changeType" // 排除 "changeType" 字段
        )
      );

      const { id, ...other } = instance.get();
      // console.log(other);
      return sequelize.model("needHistory").create({
        needId: id,
        changedField,
        //  获取当前实例的所有值
        ...other,
      });
    }
  });

  // 0.5.3 取消
  // //  需求状态变更时 need.status=>user_need.status 同步
  // Need.addHook("afterUpdate", (instance, options) => {
  //   if (instance.changed("status")) {
  //     // 检查 status 字段是否发生了变化
  //     return sequelize.model("user_need").update(
  //       { status: instance.status },
  //       { where: { needId: instance.id } } // 更新 user_need 表中与当前 need 实例相关联的记录
  //     );
  //   }
  // });

  return { Need };
};
